package com.qf.BeanFactory;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BeanFactory {
    //方式一:使用工厂类读取配置文件,加载资源文件
    //构造方法私有化
    private BeanFactory(){};
    public static Object getBean(String Beanname) throws Exception{
        //加载资源文件,获取资源输入流
        InputStream inputStream = BeanFactory.class.getClassLoader().getResourceAsStream("Bean.properties");

        //创建属性集合列表
        Properties properties = new Properties();
        //封装属性集合列表
        properties.load(inputStream);
        //通过key值获取value
        String userServiceImpl = properties.getProperty(Beanname);
        Class clazz = Class.forName(userServiceImpl);
        Object obj = clazz.newInstance();

        return obj;

    }
    //第二种,通过解析自定义的xml文件,获取服务层的对象
    public static Object getObj(String id) throws Exception {
        //第一步;导包-->log4J->版本1.2.17
        //第二步:导入xpath表达式的jar包-->快速定位到xml文件中某个标签的位置
        //第三步 自定义xml文件.确定访问路径
        //第四步: 创建解析器对象
        SAXReader saxReader = new SAXReader();
        //第五步:读取xml文件,获取资源输入流
        InputStream inputStream = BeanFactory.class.getClassLoader().getResourceAsStream("bean.xml");
        Document document = saxReader.read(inputStream);
        //第六步:获取元素对象,"//不分层级关系选择标签"
        Element element = (Element) document.selectSingleNode("//bean[@id='" + id + "']");
        //再通过元素对象获取classs属性值
        String userServiceImplClass = element.attributeValue("class");
        //获取服务层的字节码文件
        Class clazz = Class.forName(userServiceImplClass);
        Object obj = clazz.newInstance();
        return obj;
    }

}
